package com.appspot.meuacervo.server;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.blog.paulo.testegwt.entidades.Evento;
import br.blog.paulo.testegwt.entidades.Inscricao;
import br.blog.paulo.testegwt.server.persistencia.EMF;

import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

public class Auth extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws IOException {
		UserService userService = UserServiceFactory.getUserService();

		String thisURL = request.getRequestURI();

		// Se está logado
		if (request.getUserPrincipal() != null) {
			response
					.getWriter()
					.println(
							"<p id=\"ola\">Olá "
									+ request.getUserPrincipal().getName()
									+ ", você está devidamente autenticado no sistema e "
									+ ((userService.isUserAdmin()) ? "É"
											: "NÃO é")
									+ " um Administrador! Clique aqui para <a id=\"logoutLink\" href=\""
									+ userService.createLogoutURL(thisURL)
									+ "\">sair</a>.</p><pre>");

			EntityManager em = EMF.get().createEntityManager();

			EntityTransaction tx = em.getTransaction();
			try {

				/* Cria um evento */
				tx.begin();
				Evento evento = new Evento();
				evento.setLimiteInscricoes(10);
				evento.setDescricao("DojoMPDFT 04/06/2010");
				em.persist(evento);
				tx.commit();
				
				/* Localiza o evento de código 1 */
				Evento eventoPersistente = em.find(Evento.class, 1);
				if (eventoPersistente != null) {
					response.getWriter().println("--- Evento Persistente de código 1 ---");
					response.getWriter().println("id: " + eventoPersistente.getId());
					response.getWriter().println("descricao: " + eventoPersistente.getDescricao());
					response.getWriter().println("limite: " + eventoPersistente.getLimiteInscricoes());
					response.getWriter().println("inicio: " + eventoPersistente.getDataInicial());
					response.getWriter().println("fim: " + eventoPersistente.getDataFinal());
					response.getWriter().println("---");	
					
					/* Registra uma inscrição no evento 1 */
					tx.begin();
					Inscricao inscricao = new Inscricao();
					inscricao.setEvento(eventoPersistente);
					inscricao.setNome(request.getUserPrincipal().getName());
					inscricao.setDataInscricao(new Date());
					em.persist(inscricao);
					tx.commit();
				}

				/* Localiza todos os eventos */
				Query qEvento = em.createQuery("SELECT FROM Evento");
				List<Evento> listaEventos = qEvento.getResultList();

				if (listaEventos != null) {
					for (Evento i : listaEventos) {
						response.getWriter().println("id: " + i.getId());
						response.getWriter().println("descricao: " + i.getDescricao());
						response.getWriter().println("limite: " + i.getLimiteInscricoes());
						response.getWriter().println("inicio: " + i.getDataInicial());
						response.getWriter().println("fim: " + i.getDataFinal());
						response.getWriter().println("---");
					}
				} else {
					response.getWriter().println("Lista de eventos vazia!  :(");
				}
				
				/* Localiza todas as inscrições */
				Query qInscricoes = em.createQuery("SELECT FROM Inscricao");
				List<Inscricao> listaInscricoes = qInscricoes.getResultList();

				if (listaInscricoes != null) {
					for (Inscricao i : listaInscricoes) {
						response.getWriter().println("id: " + i.getId());
						response.getWriter().println("nome: " + i.getNome());
						response.getWriter().println("evento: " + i.getEvento().getDescricao());
						response.getWriter().println("dtInscricao: " + i.getDataInscricao());
						response.getWriter().println("---");
					}
				} else {
					response.getWriter().println("Lista de inscricoes vazia!  :(");
				}
				
			} catch (Exception e) {
				e.printStackTrace();

			} finally {
				if (tx.isActive()) {
					tx.rollback();
				}

				em.close();
			}

		} else { // Se não está logado
			response.getWriter().println(
					"<p>Clique aqui para <a id=\"loginLink\" href=\""
							+ userService.createLoginURL(thisURL)
							+ "\">entrar</a>.</p>");
		}
	}
}